"""
寻找宿舍门的密码:
今天早上，你的室友因为睡过头被锁在了宿舍里。
宿舍的门安装了一把高级密码锁。
当尝试解锁时，锁会生成一串包含随机英文字母和数字的字符串。为了解锁，你需要从这串字符串中找出所有的数字，按大小排序后组合成一个整数。
此外，你还需要获取所有室友当前位置的经纬度，并将经纬度的小数部分相加。
然后，你需要将这个整数与经纬度小数部分的和相乘，取结果的前8位数字作为解锁密码。

先编写一个 gen_txt 函数，它会生成一个包含100位随机英文数字字符的字符串，其中包含10位数字。
然后请编写一个名为 unlock_door 的函数，它接受上面生成的随机字符串和一个包含室友经纬度的列表，并返回一个字符串作为解锁密码。

例如：
random_string = gen_txt()
locations = [(120.12345, 30.04321), (121.03456, 31.95678), (122.04567, 32.06789)]   # 3个舍友的经度，纬度
password = unlock_door(random_string, locations)
print(password)
"""
def unlock_door(random_string, locations):
    import re
    # 匹配数字： \d
    # 匹配小写英文： [a-z]
    # 匹配大写英文： [A-Z]
    # 匹配中文： [\u4e00-\u9fa5]
    # 匹配0到多次： *
    # 匹配1到多次： +
    # 匹配m到n次： {m,n}
    numbers = re.findall(r'\d', random_string) # 在字符串中匹配相应的字符，返回一个列表，没找到就返回一个空列表
    numbers.sort() #sort()默认按升序对列表中的元素进行排序。sort(reverse=True)为降序。
    combined_number = int(''.join(numbers))
    # 提取所有室友经纬度的小数部分相加
    decimal_part_sum = sum([int(str(lo).split('.')[-1]) + int(str(la).split('.')[-1]) for (lo, la) in locations])
    # 与提取的数字相乘
    decimal_part_sum *= combined_number
    password = str(decimal_part_sum)[:8] # 取前8位作为密码
    return password

def gen_txt():
    import random
    # 生成100位随机英文数字字符
    chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    random_string = ''.join([random.choice(chars) for _ in range(100)])
    # 随机插入10位数字
    for _ in range(10):
        # 从随机字符串中随机选择一个字符，替换为随机数字
        '''
        random_string.replace(old, new, count)：
        这个方法用于在random_string中查找子串old（此处为随机选取的字符），
        并将其替换为new（此处为随机生成的数字字符串），
        但仅替换前count次出现的old。
        '''
        random_string = random_string.replace(random.choice(random_string), str(random.randint(0, 9)), 1)
    print(f"密钥: {random_string}")
    return random_string

if __name__ == '__main__':
    random_string = gen_txt()
    locations = [(120.12345, 30.04321), (121.03456, 31.95678), (122.04567, 32.06789)]
    password = unlock_door(random_string, locations)
    print(f"密码：{password}")